package jp.androidgroup.chiba.androidresearch.oauth;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import jp.androidgroup.chiba.androidresearch.Common;
import jp.androidgroup.chiba.androidresearch.Constants;
import jp.androidgroup.chiba.androidresearch.UserInfo;

import oauth.signpost.OAuthConsumer;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.util.Log;

/**
 * GoogleAccoutnsからユーザ情報を取得し、SharedPreferencesに保存するクラス
 */
public class OAuthGoogleAccounts {

	/**
	 * GoogleAccoutnsからユーザ情報を取得し、SharedPreferencesに保存します。<br>
	 *
	 * @param context SharedPreferencesオブジェクト取得のために使用します。
	 * @param consumer 認証済みのOAuthConsumer
	 *
	 * @throws OAuthCommunicationException
	 * @throws OAuthExpectationFailedException
	 * @throws OAuthMessageSignerException
	 * @throws IOException
	 * @throws ClientProtocolException
	 * @throws JSONException
	 */
	public void doGoogleAuth(Context context, OAuthConsumer consumer)
			throws OAuthMessageSignerException,
			OAuthExpectationFailedException, OAuthCommunicationException,
			ClientProtocolException, IOException, JSONException {
		JSONObject json = null;
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet request = new HttpGet(Constants.API_REQUEST);

		consumer.sign(request);
		HttpResponse httpResponse = httpClient.execute(request);

		int status = httpResponse.getStatusLine().getStatusCode();

		// HTTPのリザルトコードが200番だったら成功
		if (HttpStatus.SC_OK == status) {

			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			httpResponse.getEntity().writeTo(outputStream);
			String data = outputStream.toString();

			// GETで取得したデータからJSONObjectを生成します。
			json = new JSONObject(data);

			Log.i(Common.LOT_TAG, "JSON String : " + json.toString());

			// ユーザ情報をSharedPreferencesに保存します。
			SharedPreferencesManager spm = new SharedPreferencesManager(context);
			spm.setUserInfo(new UserInfo(json));
		}else{
			Log.e(Common.LOT_TAG, "認証に失敗しました。 リザルトコード：" + status);
		}
	}
}
